package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"path/filepath"
)

const (
	_  = iota
	KB = 1 << (10 * iota)
	MB = 1 << (10 * iota)
	GB = 1 << (10 * iota)
	TB = 1 << (10 * iota)
	PB = 1 << (10 * iota)
)

const ReturnMaxFile = "returnMaxFile.txt"

var (
	sea Search
	adm maxFiledAdmin
)

// 大文件管理
func main() {
	// 捕获到panic异常
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(err)
		}
	}()

	adm = maxFiledAdmin{
		adminFile: make([]maxFile, 0, 100),
	}

	var i int
	fmt.Print(`
		1、使用配置文件
		2、控制台录入
		3、退出
		`)
	fmt.Print("请选择需要使用的功能编号：")
	fmt.Scanln(&i)
	switch i {
	case 1:
		sea = input01()
	case 2:
		sea = input02()
	default:
		os.Exit(1)
	}
	sea.seaFile(&adm)

	res := getOsPath() + "\\" + ReturnMaxFile
	fmt.Println(res)

	file, err := os.OpenFile(res, os.O_CREATE|os.O_TRUNC|os.O_APPEND, 0644)
	if err != nil {
		fmt.Println("open file failed, err:", err)
		return
	}
	defer file.Close()
	for _, s := range adm.adminFile {
		file.WriteString(s.fielPath + "    文件大小：" + s.fileSize)
		file.WriteString("\r\n")
	}

}

// 加载配置文件，初始化管理结构体
func input01() Search {

	// 当前目录
	file, err := os.Open(getOsPath() + "\\config.txt")
	//file,err := os.Open("D:\\config.txt")
	if err != nil {
		fmt.Printf("配置文件读取失败：%v \n", err)
		panic("")
	}
	defer file.Close()

	se := &Search{}

	reader := bufio.NewReader(file)
	line, err := reader.ReadString('\n') //注意是字符

	err2 := json.Unmarshal([]byte(line), se)
	if err2 != nil {
		fmt.Printf("json转结构体失败：%v \n", err2)
		panic("")
	}
	if se.SizeUnit == 2 {
		se.Maxfilesize *= GB
	} else {
		se.Maxfilesize *= MB
	}
	return *se
}

// 控制台录入管理信息
func input02() Search {
	var (
		rootPath    string
		maxfilesize int64
		sizeUnit    int64
	)
	fmt.Print("请选择需要管理的目录：")
	fmt.Scanln(&rootPath)
	fmt.Print("请选择需要管理文件的大小（整数）：")
	fmt.Scanln(&maxfilesize)
	fmt.Print("请选择需要管理文件的大小单位（整数 ：1 MB 2 GB）：")
	fmt.Scanln(&sizeUnit)
	if sizeUnit == 2 {
		maxfilesize *= GB
	} else {
		maxfilesize *= MB
	}
	return newSearch(rootPath, maxfilesize, sizeUnit)
}

// 获取当前程序执行的根目录
func getOsPath() string {
	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
	if err != nil {
		fmt.Printf("获取当前程序执行目录失败 %v \n", err)
		panic("")
	}
	return dir
}
